package cn.e4j.modular.system.service.impl;

import cn.e4j.core.dto.Dtos;
import cn.e4j.core.dto.IDto;
import cn.e4j.core.dto.impl.Dto;
import cn.e4j.core.util.ToolUtil;
import cn.e4j.modular.system.entity.SysUser;
import cn.e4j.modular.system.mapper.SysUserMapper;
import cn.e4j.modular.system.mapper.SystemMapper;
import cn.e4j.modular.system.service.SysUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 系统服务类  提供系统级别的业务处理
 * </p>
 *
 * @author wenchuan.li
 * @date 2018/12/04 17:02
 */
@Service
public class SystemServiceImpl{

    @Resource
    private SystemMapper systemMapper;

    @Autowired
    private SysUserMapper userMapper;

    /**
     * 根据用户ID获取其名下具备的权限列表
     * 包括菜单初始化访问权限、功能操作类UI组件
     *
     * @param account
     * @return permissions 权限标识集合
     */
    public List<String> getPermissionsByAccount(String account){
        List<String> permissions = Lists.newArrayList();
        IDto inDto = Dtos.newDto("account",account);
        List<Dto> menus = systemMapper.getMenuPermissionsByAccount(inDto);
        for (Dto menu : menus) {
            permissions.add(menu.getString("PERMISSION_"));
        }
        List<Dto> uis = systemMapper.getUIPermissionsByAccount(inDto);
        for (Dto ui : uis) {
            permissions.add(ui.getString("DOM_PERSSION_"));
        }

        return permissions;

    }
    /**
     * 根据当前下属组织（部门）获取用户信息
     * <p>
     * list所属部门+下级部门 来自 getSys003()
     *
     * @return
     * @author wenchuan.li 2018/10/26 12:27.
     */
    public Dto getSys004(SysUser currentUser,List<Dto> list) {
        List<Dto> _list = new ArrayList<>();
        Dto inDto = Dtos.newDto();
        //如果小于等于1 代表没有下级
        if (list!=null && list.size() > 1) {
            inDto.put("ORGS", list);
            _list = systemMapper.getSys004(inDto);
            if (ToolUtil.isEmpty(_list)) {
                _list = new ArrayList<>();

            }
        }
        Dto dto = Dtos.newDto();
        dto.put("ID", currentUser.getID());
        _list.add(dto);
        inDto.put("YWY", _list);
        return inDto;
    }
    /**
     * 根据当前登录者id,获取登陆者下属组织（部门）
     *
     * @return
     * @author wenchuan.li 2018/10/26 12:27.
     */
    public Dto getSys0031(SysUser currentUser) {
        Dto inDto = Dtos.newDto();
        inDto.put("ID", currentUser.getID());
        List<Dto> _list = systemMapper.getSys003(inDto);
        if (ToolUtil.isEmpty(_list)) {
            _list = new ArrayList<>();
        }
        inDto.put("ORGS", _list);
        return inDto;
    }

    /**
     * 根据当前登录者id,获取登陆者所属组织（部门）和下属组织（部门）
     *
     * @return
     * @author wenchuan.li 2018/10/26 12:27.
     */
    public Dto getSys003(SysUser currentUser) {
        Dto inDto = Dtos.newDto();
        inDto.put("ID", currentUser.getID());
        List<Dto> _list = systemMapper.getSys003(inDto);
        if (ToolUtil.isEmpty(_list)) {
            _list = new ArrayList<>();

        }
        Dto dto = new Dto();
        dto.put("ID", currentUser.getORG_ID());

        _list.add(dto);
        inDto.put("ORGS", _list);
        return inDto;
    }

    /**
     * 获取归属法人（公司）列表
     *
     * @param dto
     * @return
     * @author wenchuan.li 2018/09/28 16:43.
     */
    public List<Dto> getSys001(Dto dto) {
        return systemMapper.getSys001(dto);
    }

    /**
     * 获取归属法人（公司） 根据当前用户的org_id
     *
     * @param dto
     * @return
     * @author wenchuan.li 2018/10/26 12:27.
     */
    public Dto getSys002(Dto dto) {
        List<Dto> list = systemMapper.getSys001(dto);
        if (list.size() > 0) {
            return list.get(0);
        }
        Dto out = Dtos.newDto();
        out.put("ID_", "");
        return out;
    }

    /**
     * 根据登录名获取用户信息
     *
     * @param account
     * @return
     */
    public SysUser getUserByLoginName(String account) {
        Dto qDto = new Dto();
        qDto.put("ACCOUNT", account);
        qDto.put("IS_DEL", "0");

        return new SysUser().selectOne(new QueryWrapper<SysUser>().allEq(qDto));
    }

}
